package com.cloud.bssp.juc.jmm;

/**
 * @description：
 * @author：weirx
 * @date：2021/12/22 14:41
 * @version：3.0
 */
public class VolatileTest {

    /**
     * 定义一个volatile修饰的共享变量
     */
    volatile static boolean flag = false;

    /**
     * 定义全局变量num
     */
    static int num = 0;

    public static void test1() {
        num = 2;
        // 此处修改数据ready，会增加一个写屏障，从而num、ready在修改数据后，都会添加到主存当中
        flag = true;
    }

    public static void test2() {
        // 此处读取数据ready，会增加一个读屏障，保证后面的ready和num都会从主存当中获取数据
        if (flag) {
            System.out.println(num);
        }
    }

    public static void main(String[] args) {

        new Thread(() -> {
            test1();
        }, "t1").start();

        new Thread(() -> {
            test2();
        }, "t2").start();
    }
}
